<?php

namespace App\Extend;

use App\Exceptions\ApiException;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

class Acloud
{
    /**
     * 获取配置文件.
     *
     * @return array
     */
    private static function getConfig()
    {
        // 使用RAM账号,需要授权
        $key    = config('style.sms.key');
        $secret = config('style.sms.secret');
        $sign   = config('style.sms.sign');

        return compact('key', 'secret', 'sign');
    }

    /**
     * 发送短信
     *
     * @param $mobile
     * @param $template
     * @param $param
     *
     * @return mixed
     *
     * @throws ClientException
     */
    public static function sendSms($mobile, $template, $param)
    {
        $config = self::getConfig();

        AlibabaCloud::accessKeyClient($config['key'], $config['secret'])
            ->regionId('cn-hangzhou')                           // 指定请求的地域
            ->asDefaultClient();

        try {
            $result = AlibabaCloud::rpc()
                ->product('Dysmsapi')                           // 指定产品
                // ->scheme('https')                            # https | http
                ->version('2017-05-25')                         // 指定产品版本
                ->action('SendSms')                             // 指定产品接口
                ->method('POST')                                // 指定请求方式
                ->host('dysmsapi.aliyuncs.com')                 // 指定域名则不会寻址，如认证方式为Bearer Token的服务则需要指定。
                ->options([
                    'query' => [
                        'PhoneNumbers'  => $mobile,             // 手机号
                        'SignName'      => $config['sign'],     // 签名
                        'TemplateCode'  => $template,           // 模板
                        'TemplateParam' => json_encode($param),  // 模板参数
                    ],
                ])
                ->request();
            $res = $result->toArray();
            throw_if('OK' != $res['Code'], new ApiException('短信发送失败:' . $result['Message']));

            return true;
        } catch (ClientException|ServerException $e) {
            throw_if(true, new ApiException($e->getErrorMessage()));
        } catch (\Exception $e) {
            throw_if(true, new ApiException($e->getMessage()));
        }
    }
}
